package com.gyms.manager;

import com.classic.okhttp.beans.HVRefundConfigBean;
import com.classic.okhttp.beans.HVVenueOrderFieldBean;

import java.util.ArrayList;

import utils.StringUtils;

/**
 * Created by ltx on 17/4/11.
 * 退款规则管理类
 * 返回退款金额
 */

public class RevertManger {
    private static RevertManger instance;
    private ArrayList<HVRefundConfigBean> mRefundConfigs;//退款时间范围跟比例
    private int mServerTS;//请求成功后的服务器时间
    private int mLocationTs;//请求成功后的本地时间

    public static RevertManger getInstance() {
        if (instance == null) {
            instance = new RevertManger();
        }
        return instance;
    }

    /**
     * 初始化数据
     * @param mServerTS 当前服务器的时间
     * @param mRefundConfigs 可退款的规则列表
     *  @param  mLocationTs 当前本地的时间
     */
    public void initDatas(int mServerTS,int mLocationTs,ArrayList<HVRefundConfigBean> mRefundConfigs){
        this.mServerTS=mServerTS;
        this.mRefundConfigs=mRefundConfigs;
        this.mLocationTs=mLocationTs;
    }

    /**
     * 根据单个场地bean计算可用退款 以及退款金额
     * @param fieldBean 场地bean
     *@return 可用的退款规则  null 就代表没有
     */
    private HVRefundConfigBean doCheckIsCanRevert(HVVenueOrderFieldBean fieldBean,int mNowTime) {
        int mStartTime=fieldBean.getStartTime();//场馆开始的时间
        HVRefundConfigBean mCongfigBean=null;//当前子订单所符合的最大规则
        int mConfigsSize=mRefundConfigs.size();//规则的数量
        for(int timePos=0;timePos<mConfigsSize;timePos++){
            HVRefundConfigBean mTempConfigBean=mRefundConfigs.get(timePos);
            int mTempDueTime=mTempConfigBean.getDueTime();//符合的时间
            int mRealTime=mServerTS+(mNowTime-mLocationTs);
            int mTimeDistance=mStartTime-mRealTime;//现在的时间离场馆开始时间的时间间隔
            if(mTimeDistance>=mTempDueTime){//大于当前符合规则的时间 就符合
                mCongfigBean=mTempConfigBean;
            }
        }
        return mCongfigBean;

    }

    /**
     * 整单退 以最小的比例退款
     * @param mBuyPrice 购买的金额
     *
     */

    public double doRevertAllChildOrders(ArrayList<HVVenueOrderFieldBean> mOrderField,double mBuyPrice,int mCurTimes) {
        double mCanRevertMoney=-1;
        ArrayList<HVRefundConfigBean> mCanUseConfigS=new ArrayList<>();
        boolean isCanRevert=false;//是否可退款
        // 可退款规则列表不为空 已经在外判读
        if(StringUtils.isNull(mRefundConfigs)){
            return mBuyPrice;
        }
       for(int pos=0;pos<mOrderField.size();pos++){
           HVVenueOrderFieldBean mOrderFiledBean=mOrderField.get(pos);
          HVRefundConfigBean mCongfigBean= doCheckIsCanRevert(mOrderFiledBean,mCurTimes);

           if(StringUtils.isNull(mCongfigBean)){//有一单不符合退款规则就 不可退
               isCanRevert=false;
              break;
           }else{
               mCanUseConfigS.add(mCongfigBean);
               isCanRevert=true;
           }

       }

       if(isCanRevert){//可退款就执行 可返还的金额
           HVRefundConfigBean mCanseConfigBean=mCanUseConfigS.get(0);//因为顺序是 从小到大的  优惠券就取最小的
           mCanRevertMoney=getRevertMoney(mCanseConfigBean,mBuyPrice);
           mCanRevertMoney=Math.floor(mCanRevertMoney*100)/100;
       }
       return mCanRevertMoney;
    }

    /**
     * 计算单个场地的退款规则
     * @param mFieldBean 单个退款场地
     * @param mNowTime 当前的时间戳 s
     */

    public double doRevertSingleField(HVVenueOrderFieldBean mFieldBean, int mNowTime){
        double mBuyPrice=mFieldBean.getPrice();//购买的价格
        if(StringUtils.isNull(mRefundConfigs)){
                return mBuyPrice;
        }
        double mCanRevertMoney=-1;//默认是－1
        HVRefundConfigBean mCanUseConfigBean=doCheckIsCanRevert(mFieldBean,mNowTime);
        if(!StringUtils.isNull(mCanUseConfigBean)){
            mCanRevertMoney=getRevertMoney(mCanUseConfigBean,mBuyPrice);//
            mCanRevertMoney=Math.floor(mCanRevertMoney*100)/100;
        }
        return mCanRevertMoney;
    }

    /**
     * 整单退 根据可退款规则算出退款的金额
     * @param mCanseConfigBean 可退款的规则bean
     * @param mPrice 实际金额
     *
     */

    private double getRevertMoney(HVRefundConfigBean mCanseConfigBean, double mPrice) {
        double mCanRevertMoney;
        int mRatio = mCanseConfigBean.getRatio();
        mCanRevertMoney = mPrice * mRatio / 100;//返还的金额

        return mCanRevertMoney;

    }


}
